<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // 关于构造函数的返回值
    // 1. 默认情况下,构造函数执行完毕返回一个实例化对象(构造函数内部创建)
    // 2. 构造函数也可以自定义返回值
    //   a. 如果返回值是值类型(基本数据类型) => 仍然返回被创建的实例化对象
    //   b. 如果返回值是引用类型(对象类型)  => 返回该实例化对象

    // 自定义返回值后 => 返回其他的数据(对象类型)  => 该对象的原型属性指向创建它的构造函数的原型对象(arr => Array.prototype  str =>  String.prototype)
    // 返回的对象 不能使用 当前构造函数的原型对象上的属性和方法

    // 如何既自定义返回值,又能让其访问当前构造函数的原型对象上属性和方法?
    // Object.getPrototypeOf(target)  传入一个对象,获取对象的原型属性指向
    // Object.setPrototypeOf(target,proto)  传入一个对象,设置对象的原型属性指向

    function Fn(){
        // {}
        // {}[[Prototype]] = GetEle.prototype;
        // this -> {}


        // 默认情况下,构造函数执行完毕返回一个实例化对象(构造函数内部创建)
        // return this;

        // 返回值类型
        // return 100;
        // return "100";
        // return true;
        // return null;
        // return undefined;

        // 返回引用类型
        // var obj = {a:1,b:2};
        // var list = [1,2,3,4];
        // return list;
        // return obj;
        // return new String("hello");
        // return new Number(100);
        // return new Boolean(true);

        // 返回数组
        // var list = [1,2,3,4];
        // return list;  // list.__proto__ => Array.prototype

        // 返回一个伪数组 (有数组的结构,但是不能使用数组的拓展方法)
        // 建议真数组改伪数组,不建议伪数组直接改
        var list = [1,2,3,4];
        Object.setPrototypeOf(list,Fn.prototype) // list.__proto__ => Fn.prototype
        return list;
    }

    Fn.prototype.a = 1;
    Fn.prototype.b = 2;
    Fn.prototype.sum = function(){
        // this -> 调用此方法的实例化对象
        return this.a + this.b;
    }

    var res = new Fn();
    console.log("返回值",res);


</script>
</html>